package spring3.controller;

//import net.viralpatel.spring3.form.Contact;
import java.lang.reflect.Type;
import java.rmi.RemoteException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpSession;
import javax.swing.JOptionPane;
import javax.validation.Valid;

import localhost.prueba2pds.servicioSOA_php.ServicioPortProxy;

import org.apache.axis2.AxisFault;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import spring3.form.Encriptacion;
import spring3.form.ObjectForm;
import spring3.form.Usuario;




// TODO: Auto-generated Javadoc
/*
 * Autor: Mauricio Cuevas
 */

// TODO: Auto-generated Javadoc
/**
 * The Class UserController.
 */
@Controller
@SessionAttributes
public class CryptController {


	/**
	 * Encriptar.
	 *
	 * @param enc the enc
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/encriptar")
	public ModelAndView encriptar(@Valid Encriptacion enc, HttpSession session) {
		ServicioPortProxy sproxy = new ServicioPortProxy();
		String token = (String) session.getAttribute("token");
		try {
			if(!sproxy.comprobarLogin(token)) return new ModelAndView("Advertencia","mensaje","La sesion no es valida o ha expirado");
			String out = sproxy.encriptar(enc.getEntrada(), enc.getAccion(), token);
			
			return new ModelAndView("Resultado","mensaje",out);
			
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			
			e.printStackTrace();
			return new ModelAndView("Advertencia","mensaje","Error critico de servidor: "+e.toString());
		}
	}

	/**
	 * Logout.
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/logout")
	public ModelAndView logout(HttpSession session){
		session.setAttribute("token", "dummy");
		return new ModelAndView("Bienvenida", "usuario",new Usuario());
	}
	
	/**
	 * Registro.
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/registro")
	public ModelAndView registro(HttpSession session){
		return new ModelAndView("Registro", "usuario",new Usuario());
	}
	
	/**
	 * Registro action.
	 *
	 * @param usu the usu
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/registroAction")
	public ModelAndView registroAction(@Valid Usuario usu,HttpSession session){

		ServicioPortProxy sproxy = new ServicioPortProxy();
		try {
			
			String out = sproxy.registraUsuario(usu.getUser(), usu.getPassword());
			return new ModelAndView("Advertencia","mensaje","En verdad todo salio bien :D  "+out);
			
			
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return new ModelAndView("Advertencia","mensaje","La sesion no es valida o ha expirado");
		}


		
	}
	
	/**
	 * Ver historicos.
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/historicos")
	public ModelAndView verHistoricos(HttpSession session){
		String token = (String) session.getAttribute("token");
		ServicioPortProxy sproxy = new ServicioPortProxy();
		
		try {
			if(!sproxy.comprobarLogin(token)) return new ModelAndView("Advertencia","mensaje","La sesion no es valida o ha expirado");
			String historicosJSON = sproxy.mostrarEncriptados(token);

			Type listType = new TypeToken<ArrayList<Encriptacion>>() {}.getType();
			List<Encriptacion> listas = new Gson().fromJson(historicosJSON, listType);
			
			if(listas == null){
				return new ModelAndView("Advertencia","mensaje","Nada que mostrar");
			}
			
			Encriptacion[] listado = new Encriptacion[listas.size()];
			
			for(int i=0;i<listado.length;i++){
				listado[i] = listas.get(i);
			}
			
			ObjectForm objectForm = new ObjectForm();
			objectForm.setObjects(listado);
			
			return new ModelAndView("Historicos", "objectForm",objectForm);
			
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		return new ModelAndView("Bienvenida", "usuario",new Usuario());
	}
	
	/**
	 * Abrir principal.
	 *
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/Principal")
	public ModelAndView abrirPrincipal(HttpSession session) {
		ServicioPortProxy sproxy = new ServicioPortProxy();
		String token = (String) session.getAttribute("token");
		try {
			if(sproxy.comprobarLogin(token)) return new ModelAndView("Administracion","encriptacion",new Encriptacion());
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return new ModelAndView("Bienvenida", "usuario",new Usuario());
	}
	
	/**
	 * Cuadrado action.
	 *
	 * @param user the user
	 * @param session the session
	 * @return the model and view
	 */
	@RequestMapping("/login")
	public ModelAndView cuadradoAction(@Valid Usuario user, HttpSession session) {

		
		ServicioPortProxy sproxy = new ServicioPortProxy();
		
		
		
		try {
			String token = sproxy.login(user.getUser(), user.getPassword());
			if(sproxy.comprobarLogin(token)){
				session.setAttribute("token",token);
				return new ModelAndView("Administracion","encriptacion",new Encriptacion());
			} else {
				return new ModelAndView("Advertencia","mensaje","Los datos ingresados no son validos");
			}
			
			
			
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
		
		
		//return new ModelAndView("ServicioPHPResponse", "numero",numero);
		return null;
	}



	





}